package main

import (
	"fmt"
	"strconv"
)

// isRYear 判断是否是闰年 , 输入年份是否正确，1为闰年，2为平年，true为输入年份在符合范围中，
// false为不符合，返回RP0
func isRYear(year int) (Range bool, RP int) {
	if year >= 1990 {
		Range = true
		if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
			return Range, 1
		} else {
			return Range, 2
		}
	} else {
		Range = false
		return Range, 0
	}
}

// isRMonth 判断月份是否在正常范围
func isRMonth(month int) bool {
	if month >= 1 && month <= 12 {
		return true
	} else {
		return false
	}
}

// isFeb 判断传进来的是不是2月
func isFeb(month int) bool {
	if month == 2 {
		return true
	} else {
		return false
	}
}

// isDay 大日期 13578 10 12
// 判断日期规范是否正确，符合规范返回true
func isDay(month int, days int) bool {
	bigDay := []int{1, 3, 5, 7, 8, 10, 12}
	isEx := false
	for _, eachItem := range bigDay { //大天数：31天
		if eachItem == month { //存在这个月份开关为true
			isEx = true
		}
	}
	if isEx {
		if days <= 31 {
			return true
		} else {
			return false
		}
	} else {
		if days <= 30 {
			return true
		} else {
			return false
		}
	}
}

// countYDays 计算当前年份的日期，按照闰年计算
func countYDays(month int, day int) int {
	var monthChoice = map[int]int{
		0: 0, 1: 31, 2: 29, 3: 31, 4: 30, 5: 31, 6: 30,
		7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31,
	}
	sumDays := day
	for i := 0; i < month; i++ {
		valueCountDays, _ := monthChoice[i]
		sumDays += valueCountDays
	}
	fmt.Println("sumDays：", sumDays)
	return sumDays
}

// countDate 计算总天数，闰年多少天，平年多少天
// 判断传入的年份总共多少天，求从该年1月1日到该月该日总共多少天
// 2021 11 24 天数：1990 1 1 - 2021 11 24 全部当成366闰年计算，
// 判断是否是闰年，日期是否大于2月29日，不是闰年，日期大于2月29日，结果减-1
func countDate(year int, month int, day int) (rDay int, pDay int, allDays int) { // 2000 rYear = (2000-1992)/4 = 2, pYear = (2000-1992) - rYear = 6
	rYear := (year - 1992) / 4
	pYear := ((year - 1992) - rYear) + 2
	//rYear += 1
	fmt.Println("闰年：", rYear, "平年：", pYear) //按2000.3.1计算到2000年，3月1日的日期没加
	rDay = rYear * 366
	pDay = pYear * 365
	_, isRP := isRYear(year)
	if isRP == 2 && month > 2 { //如果是平年，输入月份大于2月，闰年算总日期-1操作
		allDays = countYDays(month, day) + rDay + pDay - 1
		fmt.Println("闰年总天数：", rDay, "平年总天数：", pDay, "是平年，总天数：", allDays)
	} else {
		allDays = countYDays(month, day) + rDay + pDay //1990到当前天数的日期
		fmt.Println("闰年总天数：", rDay, "平年总天数：", pDay, "是润年，总天数：", allDays)
	}
	if isRP == 1 {
		allDays = countYDays(month, day) + rDay + pDay //1990到当前天数的日期
		fmt.Println("闰年总天数：", rDay, "平年总天数：", pDay, "是润年，总天数：", allDays)

	}
	return rDay, pDay, allDays
}

// isRightInput 输入年份判断 输入格式判断
// 包含日期是否符合正常，平闰年区分
//返回错误则输入内容有无
func isRightInput(yearStr string, monthStr string, dayStr string) bool {
	year, errYear := strconv.Atoi(yearStr)
	month, errMonth := strconv.Atoi(monthStr)
	day, errday := strconv.Atoi(dayStr)
	if errYear != nil && errMonth != nil && errday != nil {
		fmt.Println("输入有误，格式不正确")
		return false
	} else {
		isRange, isRP := isRYear(year)
		if isRange {
			if isRP == 1 { // 判断是润年，2月只有29天
				if isRMonth(month) {
					if isFeb(month) {
						if day <= 29 {
							if isRes(year, month, day) {
								fmt.Println("这天在打鱼")
							} else {
								fmt.Println("这天在晒网")
							}
							return true
						} else {
							fmt.Println("输入的日期错误，请重新输入")
							return false
						}
					} else {
						isRight := isDay(month, day)
						if isRight {
							if isRes(year, month, day) {
								fmt.Println("这天在打鱼")
							} else {
								fmt.Println("这天在晒网")
							}
							return true

						} else {
							fmt.Println("输入的日期范围错误，请重新输入")
							return false
						}
					}
				} else {
					fmt.Println("输入的月份错误，请重新输入")
					return false
				}
			}
			if isRP == 2 { // 判断是平年，2月只有29天
				if isRMonth(month) {
					if isFeb(month) {
						if day <= 28 {
							if isRes(year, month, day) {
								fmt.Println("这天在打鱼")
							} else {
								fmt.Println("这天在晒网")
							}
							return true
						} else {
							fmt.Println("输入的日期错误，请重新输入")
							return false
						}
					} else {
						isRight := isDay(month, day)
						if isRight {
							if isRes(year, month, day) {
								fmt.Println("这天在打鱼")
							} else {
								fmt.Println("这天在晒网")
							}
							return true

						} else {
							fmt.Println("输入的日期范围错误，请重新输入")
							return false
						}
					}
				} else {
					fmt.Println("输入的月份错误，请重新输入")
					return false
				}
			}
			return true
		} else {
			fmt.Println("输入的年份范围有无，请输入1990至今的日期")
			return false
		}
	}
}

// isRes 判断返回值是打鱼还是晒网 true 打鱼 false 晒网
func isRes(year int, month int, day int) bool {
	_, _, allCountDays := countDate(year, month, day)
	res := allCountDays % 5
	fish := []int{1, 2, 3}
	isFish := false
	for _, eachItem := range fish { //大天数：31天
		if eachItem == res { //存在这个月份开关为true
			isFish = true
		}
	}
	fmt.Printf("res： %v\n", res)
	return isFish
}

func main() {

	/*
		中国有句俗语叫 “三天打鱼两天晒网 ”。某人从 1990年 1月 1日起开始“三天打鱼两天晒网”，问这个人在以后的某一天中是“打鱼”还是“晒网”。
		根据题意可以将解题过程分为三步：
		1)计算从 1990年 1月 1日开始至指定日期共有多少天；
		2)由于“打鱼”和“晒网”的周期为 5天，所以将计算出的天数用 5去除；
		3)根据余数判断他是在“打鱼”还是在“晒网”；若余数为 1，2，3，则他是在“打鱼”否则是在“晒网”在这三步中，关键是第一步。
		求从 1990年 1月 1日至指定日期有多少天，要判断经历年份中是否有闰年，二月为 29天，平年为 28天。闰年的方法可以用伪语句描述如下：
		如果 ((年能被 4除尽且不能被 100除尽)或能被 400除尽)则该年是闰年；否则不是闰年。
	*/

	// 假设，输入一个 2000 年 //润
	// 1990.1.1-2000.3.1（2000-1992）=8/4=2年闰年（1992，1996）；计算闰年的总天数和平年的总天数
	// 1990,1991 f 365
	// 1992 t 366
	// 1993,1994,1995 f
	// 1996 t
	// 1997, 1998, 1999 f
	isRange, _ := isRYear(2020)
	fmt.Printf("判断是否闰年： %v\n", isRange)
	var yearStr string
	var monthStr string
	var dayStr string
	for {
		//输入开始
		fmt.Printf("请输入年份：")
		fmt.Scanln(&yearStr)
		fmt.Printf("请输入月份：")
		fmt.Scanln(&monthStr)
		fmt.Printf("请输入日期：")
		fmt.Scanln(&dayStr)
		if isRightInput(yearStr, monthStr, dayStr) {
			break
		} else {
			continue
		}
	}
	// 无条件判断验证，核心
	/*_, _, allCountDays := countDate(2000, 2, 30)
	res := allCountDays % 5
	fmt.Printf("res111： %v\n", res)*/

}
